/*
  ts 中的函数 和c#一样也是 八九不离十
    约束了返回值类型  参数类型等等  
*/

function sum(a: number, b: number): number {
  return a + b
}

console.log(sum(10, 8)) // 18 能正常运行

function sum1(...args: Array<number>): number {
  return args.reduce((a, b) => {
    return a + b
  }, 0)
}
console.log(sum1(10, 56, 87, 90)) // 243 是可以继续使用es6的一些好用的语法的

/*
  函数重载
    像c# java这种完全面向对象的语言就有函数重载的这一特性
      函数重载 -- 函数方法名相同 形参不同  
    
    在过去中 js如果写了方法名相同 形参不同的函数要么就是被覆盖 要么就是直接报错的，也就是hs是
      没有这种特性的 ， ts为了弥补这个 但是又要考虑兼容性，所以重载上面和c#的写法就有点不一样了
*/

/*
  以下就是 ts 提供的重载，  这种重载显然和c# java是不一样的  但是确实是也是重载
*/

function userInfo(name: string): string
function userInfo(name: string, age: number): string
function userInfo(name: any, age?: any): any {
  if (age) {
    return `${name}的年龄是${age}`
  } else {
    return `我是${name}`
  }
}
let flag1: string = userInfo('jimmy', 20)
let flag2: string = userInfo('xuexue')
console.log(flag1) // jimmy的年龄是20
console.log(flag2) // 我是xuexue

/*
  ?: 表示可有可的意思
*/
